#include "memory.h"
#include <algorithm>

#include "array.h"

void Array::ensureSize() {
    if(size < capacity) {
        return;
    }
    Array tmp(size * 2);
    tmp.size = size;
    memcpy(tmp.arr, arr, sizeof(int) * size);
    swap(tmp);
}

Array::Array(size_t size):
        size(size),
        capacity(size), 
        arr(new int[capacity]) {
}

Array::Array(const Array & array):
        size(array.size),
        capacity(array.capacity), 
        arr(new int[capacity]) {

    memcpy(arr, array.arr, sizeof(int) * size);    
}

void Array::swap(Array & array) {
    std::swap(array.size, size);
    std::swap(array.capacity, capacity);
    std::swap(array.arr, arr);
}

Array & Array::operator =(const Array & array) {
    Array tmp(array);
    swap(tmp);
    return *this;
}

void Array::push_back(int i) {
    ensureSize();
    arr[size++] = i;
}

int Array::get(size_t index) const {
    return arr[index];
}

void Array::set(size_t i, int v) {
    arr[i] = v;
}

size_t Array::getSize() const {
    return size;
}

Array::~Array() {
    delete[] arr;
}
